home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyo (Python 2.5)
-
- from __future__ import with_statement
- from jabber.objects.si_filetransfer import File
- from common.filetransfer import IncomingFileTransfer
- from jabber.objects.si_filetransfer import Feature
- from jabber.objects.si_filetransfer import SI_FileTransfer
- from jabber.objects.si import SI_NS
- from pyxmpp.error import STANZA_ERROR_NS
- from pyxmpp.all import Iq
- from util.primitives import lock
- from jabber.filetransfer.initiateStream import if_not_done, done_states
- from path import path
- import threading
- from logging import getLogger
- log = getLogger('jabber.ft.si')
-
- class StreamInitiationHandler(object):
-
- def __init__(self, jabber_object):
- self.j = jabber_object
- self.handlers = { }
- self.supported_streams = { }
-
-
- def set_stream_handler(self, namespace, handler):
- self.supported_streams[namespace] = handler
-
-
- def set_profile_handler(self, namespace, handler):
- self.handlers[namespace] = handler
-
-
- def register_handlers(self):
- self.j.stream.set_iq_set_handler('si', SI_NS, self.incoming)
-
-
- def incoming(self, stanza):
- prof = stanza.xpath_eval('si:si/@profile', {
- 'si': SI_NS })[0].content
- if prof not in self.handlers:
- self.respond_not_understood(stanza)
- else:
- self.handlers[prof](self, Iq(stanza.get_node()))
-
-
- def respond_no_valid(self, stanza):
- e = stanza.make_error_response('bad-request')
- n = e.xpath_eval('si:si', {
- 'si': SI_NS })[0]
- n.unlinkNode()
- n.freeNode()
- e.set_from(None)
- er = e.xpath_eval('ns:error')[0]
- er.newProp('code', '400')
- c = er.newChild(None, 'no-valid-streams', None)
- ns = c.newNs(SI_NS, None)
- c.setNs(ns)
- t = e.xpath_eval('ns:error/@type')[0]
- t.setContent('cancel')
- self.j.send(e)
-
-
- def respond_not_understood(self, stanza):
- e = stanza.make_error_response('bad-request')
- n = e.xpath_eval('si:si', {
- 'si': SI_NS })[0]
- n.unlinkNode()
- n.freeNode()
- e.set_from(None)
- er = e.xpath_eval('ns:error')[0]
- er.newProp('code', '400')
- c = er.newChild(None, 'bad-profile', None)
- ns = c.newNs(SI_NS, None)
- c.setNs(ns)
- self.j.send(e)
-
-
- def reject(self, stanza, reason = None):
- e = stanza.make_error_response('forbidden')
- n = e.xpath_eval('si:si', {
- 'si': SI_NS })[0]
- n.unlinkNode()
- n.freeNode()
- e.set_from(None)
- er = e.xpath_eval('ns:error')[0]
- er.newProp('code', '403')
- if not reason:
- pass
- c = er.newChild(None, 'text', 'Offer Declined')
- ns = c.newNs(STANZA_ERROR_NS, None)
- c.setNs(ns)
- self.j.send(e)
-
-
- def send_accept(self, stanza, payload):
- i = stanza.make_result_response()
- payload.as_xml(i.get_node())
- self.j.send(i)
-
-
- def result_accept(self):
- pass
-
-
- def result_error(self):
- pass
-
-
-
- class FileTransferSIHandler(IncomingFileTransfer):
-
- def __init__(self, si_handler, iq):
- self.si_handler = si_handler
- self.stanza = iq
- self.si_ft = SI_FileTransfer.from_iq(iq)
- self.bytestream = None
- self._lock = threading.RLock()
- if self.check_streams():
- ft = self.si_ft
- self.numfiles = 1
- self.name = ft.file.name
- self.size = ft.file.size
- self.buddy = self.si_handler.j.buddies[iq.get_from()]
- file_desc = unicode(ft.file.desc)
- IncomingFileTransfer.__init__(self)
- si_handler.j.hub.on_file_request(si_handler.j, self)
- self.on_get_buddy(self.buddy)
-
-
-
- def protocol(self):
- return self.si_handler.j
-
- protocol = property(protocol)
-
- def file_desc(self):
- return unicode(self.si_ft.file.desc)
-
-
- def decline(self, reason = None):
- self.si_handler.reject(self.stanza, reason)
- self.state = self.states.CANCELLED_BY_YOU
- IncomingFileTransfer.decline(self)
-
-
- def cancel(self, state = None):
- if state is None:
- state = self.states.CANCELLED_BY_YOU
-
- self.state = state
- if self.bytestream is not None:
- self.bytestream.close()
-
-
- cancel = lock(if_not_done(cancel))
-
- def accept(self, _openfileobj):
- self.state = self.states.CONNECTING
- for stream_type in self.si_handler.supported_streams:
- if stream_type in self.si_ft.feature.possible_streams:
- selected = stream_type
- break
- continue
-
- self._fileobj = _openfileobj
- self.filepath = path(_openfileobj.name)
- si_ft = SI_FileTransfer(self.si_ft.sid)
- si_ft.feature = Feature(selected_stream = selected)
- si_ft.file = File()
- self.bytestream = b = self.si_handler.supported_streams[selected](self.stanza)
- b.bind('stream_connected', self.transferring)
- b.bind('stream_closed', self.stream_closed)
- b.bind('stream_connect_failed', self.stream_connect_failed)
- b.bind('stream_data_recieved', self.incoming_data)
- b.bind('stream_error', self.stream_error)
- self.si_handler.send_accept(self.stanza, si_ft)
-
-
- def transferring(self):
- self.state = self.states.TRANSFERRING
-
- transferring = lock(if_not_done(transferring))
-
- def stream_connect_failed(self):
- self.state = self.states.CONN_FAIL
- self.cleanup()
-
- stream_connect_failed = lock(if_not_done(stream_connect_failed))
-
- def stream_error(self):
- self.state = self.states.CONN_FAIL_XFER
- self.cleanup()
-
- stream_error = lock(if_not_done(stream_error))
-
- def cleanup(self):
-
- try:
- self._fileobj.close()
- except:
- pass
-
- self.unbind_all()
- if self.state != self.states.CANCELLED_BY_YOU:
- self.on_error()
-
-
-
- def stream_closed(self):
- if self.completed == self.si_ft.file.size:
-
- try:
- self._fileobj.close()
- except:
- pass
-
- self.unbind_all()
- self._ondone()
- else:
- log.info('%r: Stream closed. Setting state to CANCELLED_BY_BUDDY and cleaning up.')
- self.state = self.states.CANCELLED_BY_BUDDY
- self.cleanup()
-
- stream_closed = lock(if_not_done(stream_closed))
-
- def unbind_all(self):
- b = self.bytestream
- b.unbind('stream_connected', self.transferring)
- b.unbind('stream_closed', self.stream_closed)
- b.unbind('stream_connect_failed', self.stream_connect_failed)
- b.unbind('stream_data_recieved', self.incoming_data)
-
-
- def check_streams(self):
- if set(self.si_ft.feature.possible_streams) & set(self.si_handler.supported_streams):
- return True
- else:
- self.si_handler.respond_no_valid(self.stanza)
- return False
-
-
- def incoming_data(self, data):
-
- try:
- self._fileobj.write(data)
- self._setcompleted(len(data) + self.completed)
- except ValueError:
- self._lock.__enter__()
-
- try:
- pass
- finally:
- pass
-
- except:
- self._lock
-
-
-
-